<?php 

class Security{
	
	private static $instance;
	private static $objSecurity;
	private static $urlSecurityClass  = 'seguranca';
	private static $urlSecurityMethod = 'index';

	/**
	 * Metodo construtor privado pois esta classe implementa um singleton;
	 */
	private function __construct(){
		print 'Construtor da classe Security';
	}
	
	/**
	 * Metodo que implementa o singleton
	 */
	public static function singleton(){
		if(!isset(self::$instance)){
			self::$objSecurity = Array();
			self::confSecurity();
		}
		return self::$instance;
	}

	/**
	 * Metodo de configuração das permissões de acesso, o mesmo ira buscar no banco de dados os metodos, 
	 * e quem possui permissão para acesso.
	 */
	private static function confSecurity(){
		// Objetos temporarios estes virá do banco de dados
		self::$objSecurity['HomeController'] = array();
		self::$objSecurity['HomeController']['index'] = 		array('access' => 'public', 'perfil' => array('SYSADMIN'), 'class' => 'login', 'method' => 'index');
		self::$objSecurity['HomeController']['erro'] = 			array('access' => 'public', 'perfil' => array());
		self::$objSecurity['HomeController']['teste'] = 		array('access' => 'public', 'perfil' => array());
		
		self::$objSecurity['LoginController']['index'] = 		array('access' => 'public', 'perfil' => array());
		self::$objSecurity['LoginController']['login'] = 		array('access' => 'public', 'perfil' => array());
		self::$objSecurity['LoginController']['verifyLogin'] = 	array('access' => 'public', 'perfil' => array());
		self::$objSecurity['LoginController']['logof'] = 		array('access' => 'private', 'perfil' => array('SYSADMIN'));
	}

	/**
	 * 
	 * @param String $class
	 * @param String $method
	 * @return boolean
	 */
	public static function checkAccess($class, $method){

		//Pega os dados do usuario na sessão;
		$user = Session::getValue('user');
		// Verifica se existe a classe no objeto security
		if(key_exists($class, self::getObjSecurity())){
			//Verifica se existe o metodo dentro da classe
			if(key_exists($method, self::getObjSecurity()[$class])){
				//se o metodo exisitir verifica se ele e publico ou privado
				switch (self::getObjSecurity()[$class][$method]['access']){
					// se for publico nao precisa verificar as permissões
					case 'public':
						return true;
						break;
					// se for privado verifico as permissões 	
					case 'private':
						foreach(self::getObjSecurity()[$class][$method]['perfil'] as $perfil){
							// Verifica se existe o obj usuario na sessão
							if(!is_null($user->perfil)){
								foreach($user->perfil as $group){
									if($perfil == $group){
										return true;
									}
								}
							}
						}
						return false;
						break;
				}
			}else{
				return true;
			}
		}else{
			return true;
		}
	}

	/**
	 * Retorna o objeto security
	 */
	public static function getObjSecurity(){
		return self::$objSecurity;
	}
	
	public static function getUrlSecurityClass(){
		return self::$urlSecurityClass;
	}
	
	public static function getUrlSecurityMethod(){
		return self::$urlSecurityMethod;
	}
}

?>